#include <stdio.h>
#include <unistd.h>
#include <sys/types.h>
#include <sys/wait.h>
#include <stdlib.h>

// pid_t fork(void);
// pid_t getpid(void);
// pid_t getppid(void);
// pid_t wait(int *status);
// exit()清空缓冲区    /_Exit() / _exit()不会清空缓冲区
int main()
{

    printf("main \n");

    pid_t pid = fork();

    if (pid == -1)
    {
        printf("创建进程失败 \n");
    }

    if (pid == 0) // 子进程
    {
        sleep(5);
        printf("child");
        exit(10); // 10退出值 exit 函数设置的退出值  只能是 0~255 范围

        printf("11112222\n");
    }

    if (pid > 0) // 父进程 但是返回的ID号表示的是子进程的ID号
    {
        sleep(1);
        printf("parent hello 父pid=%d  父父ppid=%d  子fork->pid=%d\n", getpid(), getppid(), pid);

        // 等待一个进程为的就是帮这个进程修改状态  (从僵尸态变成死亡态)
        // 阻塞的 要等子进程结束 回收资源
        // wait(NULL);

        int status; // 状态码 包括了退出值、进程是怎么结束的
        wait(&status);

        sleep(3);
        printf("status=%d\n", status); // 0==>0   1==>256  10=>2560
        //
        printf("%d  %d %d %d\n", WIFEXITED(status), WEXITSTATUS(status), WIFSIGNALED(status), WTERMSIG(status)); // 1 是正常退出 0是异常退出
        // 是否正常退出、退出码、是否被信号杀死、杀死它的信号值
        // kill -9 42857   终止进程
    }

    return 0;
}
